#ifndef Q3DSMODEL_H
#define Q3DSMODEL_H

#include <memory>

#include <qopengl.h>

#include <QMap>
#include <QVector>
#include <QVector4D>
#include <QMatrix4x4>
#include <QtMath>
#include <QColor>

class Q3dsProcess;

/// 面结构体
struct Q3dsFace
{
    // 材质
    QVector4D diffuse{ 0.7, 0.7, 0.7, 1.0 }; ///< 漫反射

    // 位置和光照角度
    QVector3D normal{ 0, 0, 0 }; ///< 法向量
    QList<QVector3D> points; ///< 顶点：一个面多个顶点，一般 3 个组成三角形
};

/// 网格结构体
struct Q3dsMesh
{
    bool background_solid_use{ false };
    QColor background_solid_color;
    QMatrix4x4 dh_matrix;    ///< dh 参数变换矩阵
    QVector<Q3dsFace> faces; ///< 面 一个网格多个面
};

class Q3dsModel
{
public:
    Q3dsModel();

    bool reload(const QStringList &dirs, const QString &robot_type,
                const std::unordered_map<std::string, std::vector<double>> &dh);
    void setJointPositions(const std::vector<double> &joint_positions);
    QVector<Q3dsMesh *> getMeshs();
    bool meshsChanged();

private:
    QStringList dirs_;
    QString robot_type_{ "" };
    std::unordered_map<std::string, std::vector<double>> dh_;
    std::string urdf_file_path;

    QVector<std::shared_ptr<Q3dsProcess>> links_;
    std::vector<double> angles_; ///< 单位 rad
    bool angles_chagned_{ false };

    QVector<Q3dsMesh *> meshs_;
    bool meshs_changed_{ false };
};

#endif // Q3DSMODEL_H
